import {VNode} from 'vue';
const _toString = Object.prototype.toString;
/**
 * 判断是否是正则表达式
 * @param {any} v		测试对象
 * @return {boolean}	是否是正则表达式
 */
export function isRegExp(v:any):boolean{
	return _toString.call(v)==='[object RegExp]';
}
/**
 * 删除数组指定元素
 * @param {Array<any} arr	数组
 * @param {any} item		需要删除的元素
 */
export function remove(arr:Array<any>,item:any):Array<any>|void{
	if(arr.length){
		const index=arr.indexOf(item);
		if(index>-1){
			return arr.splice(index,1);
		}
	}
}
/**
 * 判断是否有值
 * @param {any} v		测试对象
 * @return {boolean}	是否有值
 */
export function isDef(v:any):boolean{
	return v!==undefined&&v!==null;
}
/**
 * 判断是否是异步组件
 * @param {VNode} node	测试对象
 * @return {boolean}	是否是异步组件
 */
export function isAsyncPlaceholder(node:any):boolean{
	return node.isComment&&node.asyncFactory;
}
/**
 * 获取第一个子组件
 * @param {Array<VNode>} children	所有子节点
 * @return {VNode}	第一个子组件
 */
export function getFirstComponentChild(children?:Array<VNode>):VNode|undefined{
	if(Array.isArray(children)){
		for(let i=0;i<children.length;i++){
			const c=children[i];
			if(isDef(c)&&(isDef(c.componentOptions)||isAsyncPlaceholder(c))){
				return c;
			}
		}
	}
}
/**
 * 获取组件的name
 * @param {VNodeComponentOptions} opts	组件选项
 * @return {string}		组件的name
 */
export function getComponentName(opts:any):string{
	return opts&&(opts.Ctor.options.name||opts.tag);
}
